XML Validation Error: cvc-elt.1.a: Cannot find the declaration of element 'Statistics'
XML Validation Error: cvc-elt.1.a: Cannot find the declaration of element 'Statistics'
这是我的 XSD:
<xs:schema xmlns:tns="http://www.w3.org/1999/xhtml" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3.org/1999/xhtml" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:complexType name="Statistics">
<xs:sequence>
<xs:element name="item" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="id" type="xs:string"/>
<xs:element name="date" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="email" type="xs:string" nillable="true"/>
<xs:element name="Advertisers">
<xs:complexType>
<xs:sequence>
<xs:element name="item" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="id" type="xs:string"/>
<xs:element name="ls_revenue_usd_equivalence" type="xs:string"/>
<xs:element name="revenue_eur" type="xs:string"/>
<xs:element name="revenue_usd" type="xs:string"/>
<xs:element name="revenue_rub" type="xs:string"/>
<xs:element name="ls_leads" type="xs:string"/>
<xs:element name="revenue_usd_equivalence" type="xs:string"/>
<xs:element name="leads" type="xs:string"/>
<xs:element name="payout_usd" type="xs:string"/>
<xs:element name="payout_rub" type="xs:string"/>
<xs:element name="payout_eur" type="xs:string"/>
<xs:element name="payout_usd_equivalence" type="xs:string"/>
<xs:element name="profit" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="total">
<xs:complexType>
<xs:sequence>
<xs:element name="leads" type="xs:string"/>
<xs:element name="payout_usd" type="xs:string"/>
<xs:element name="payout_rub" type="xs:string"/>
<xs:element name="payout_eur" type="xs:string"/>
<xs:element name="payout_usd_equivalence" type="xs:string"/>
<xs:element name="profit" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
这是我的 XML:
<?xml version="1.0" encoding="UTF-8"?>
<Statistics xmlns="http://www.w3.org/1999/xhtml" attributeFormDefault="unqualified" elementFormDefault="qualified">
<item>
<id>1</id>
<date>16.12.2015</date>
<name>test</name>
<email>test</email>
<Advertisers>
<item>
<id>2</id>
<ls_revenue_usd_equivalence>0</ls_revenue_usd_equivalence>
<revenue_eur>0</revenue_eur>
<revenue_usd>0</revenue_usd>
<revenue_rub>0</revenue_rub>
<ls_leads>0</ls_leads>
<revenue_usd_equivalence>0</revenue_usd_equivalence>
<leads>0</leads>
<payout_usd>0</payout_usd>
<payout_rub>0</payout_rub>
<payout_eur>0</payout_eur>
<payout_usd_equivalence>0</payout_usd_equivalence>
<profit>0</profit>
</item>
</Advertisers>
<total>
<leads>0</leads>
<payout_usd>0</payout_usd>
<payout_rub>0</payout_rub>
<payout_eur>0</payout_eur>
<payout_usd_equivalence>0</payout_usd_equivalence>
<profit>0</profit>
</total>
</item>
</Statistics>
当我尝试验证此 XML 时,出现此错误:
cvc-elt.1.a: Cannot find the declaration of element 'Statistics'.
乍一看,没问题,和命名空间匹配。我不明白什么仍然可能是一个错误。
我做错了什么?
您使用 xs:complexType name="Statistics"
定义了一个复杂类型,但不是该名称的元素。您需要定义 <xs:element name="Statistics"><xs:complexType>...</xs:complexType></xs:element>
.
首先,不要将众所周知的命名空间、http://www.w3.org/1999/xhtml
重复用于其他用途超过其预期目的。您只是要求混淆,与现有 XML 目录冲突等
其次,attributeFormDefault
和elementFormDefault
不属于你的XML,而是属于你的XSD.
第三,正如 Martin Honnen 提到的,您的 XSD 缺少 Statistics
的元素声明。
第四,如果你真的不能改变XSD但又想使用它,你可以执行以下操作之一:
- 将它导入包装器 XSD 并声明一个
Statistics
元素,并使用 that XSD 来管理您的 XML.
- 在你的XML中使用
xsi:type
。见如何限制值的
XML 元素在 XSD? 中使用 xsi:type
以下是如何在您的案例中使用 xsi:type
(未应用建议的命名空间修复):
<?xml version="1.0" encoding="UTF-8"?>
<Statistics xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/1999/xhtml try.xsd"
xmlns:tns="http://www.w3.org/1999/xhtml"
xsi:type="tns:Statistics">
<item>
<id>1</id>
<date>16.12.2015</date>
<name>test</name>
<email>test</email>
<Advertisers>
<item>
<id>2</id>
<ls_revenue_usd_equivalence>0</ls_revenue_usd_equivalence>
<revenue_eur>0</revenue_eur>
<revenue_usd>0</revenue_usd>
<revenue_rub>0</revenue_rub>
<ls_leads>0</ls_leads>
<revenue_usd_equivalence>0</revenue_usd_equivalence>
<leads>0</leads>
<payout_usd>0</payout_usd>
<payout_rub>0</payout_rub>
<payout_eur>0</payout_eur>
<payout_usd_equivalence>0</payout_usd_equivalence>
<profit>0</profit>
</item>
</Advertisers>
<total>
<leads>0</leads>
<payout_usd>0</payout_usd>
<payout_rub>0</payout_rub>
<payout_eur>0</payout_eur>
<payout_usd_equivalence>0</payout_usd_equivalence>
<profit>0</profit>
</total>
</item>
</Statistics>
这是我的 XSD:
<xs:schema xmlns:tns="http://www.w3.org/1999/xhtml" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3.org/1999/xhtml" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:complexType name="Statistics">
<xs:sequence>
<xs:element name="item" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="id" type="xs:string"/>
<xs:element name="date" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="email" type="xs:string" nillable="true"/>
<xs:element name="Advertisers">
<xs:complexType>
<xs:sequence>
<xs:element name="item" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="id" type="xs:string"/>
<xs:element name="ls_revenue_usd_equivalence" type="xs:string"/>
<xs:element name="revenue_eur" type="xs:string"/>
<xs:element name="revenue_usd" type="xs:string"/>
<xs:element name="revenue_rub" type="xs:string"/>
<xs:element name="ls_leads" type="xs:string"/>
<xs:element name="revenue_usd_equivalence" type="xs:string"/>
<xs:element name="leads" type="xs:string"/>
<xs:element name="payout_usd" type="xs:string"/>
<xs:element name="payout_rub" type="xs:string"/>
<xs:element name="payout_eur" type="xs:string"/>
<xs:element name="payout_usd_equivalence" type="xs:string"/>
<xs:element name="profit" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="total">
<xs:complexType>
<xs:sequence>
<xs:element name="leads" type="xs:string"/>
<xs:element name="payout_usd" type="xs:string"/>
<xs:element name="payout_rub" type="xs:string"/>
<xs:element name="payout_eur" type="xs:string"/>
<xs:element name="payout_usd_equivalence" type="xs:string"/>
<xs:element name="profit" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
这是我的 XML:
<?xml version="1.0" encoding="UTF-8"?>
<Statistics xmlns="http://www.w3.org/1999/xhtml" attributeFormDefault="unqualified" elementFormDefault="qualified">
<item>
<id>1</id>
<date>16.12.2015</date>
<name>test</name>
<email>test</email>
<Advertisers>
<item>
<id>2</id>
<ls_revenue_usd_equivalence>0</ls_revenue_usd_equivalence>
<revenue_eur>0</revenue_eur>
<revenue_usd>0</revenue_usd>
<revenue_rub>0</revenue_rub>
<ls_leads>0</ls_leads>
<revenue_usd_equivalence>0</revenue_usd_equivalence>
<leads>0</leads>
<payout_usd>0</payout_usd>
<payout_rub>0</payout_rub>
<payout_eur>0</payout_eur>
<payout_usd_equivalence>0</payout_usd_equivalence>
<profit>0</profit>
</item>
</Advertisers>
<total>
<leads>0</leads>
<payout_usd>0</payout_usd>
<payout_rub>0</payout_rub>
<payout_eur>0</payout_eur>
<payout_usd_equivalence>0</payout_usd_equivalence>
<profit>0</profit>
</total>
</item>
</Statistics>
当我尝试验证此 XML 时,出现此错误:
cvc-elt.1.a: Cannot find the declaration of element 'Statistics'.
乍一看,没问题,和命名空间匹配。我不明白什么仍然可能是一个错误。 我做错了什么?
您使用 xs:complexType name="Statistics"
定义了一个复杂类型,但不是该名称的元素。您需要定义 <xs:element name="Statistics"><xs:complexType>...</xs:complexType></xs:element>
.
首先,不要将众所周知的命名空间、http://www.w3.org/1999/xhtml
重复用于其他用途超过其预期目的。您只是要求混淆,与现有 XML 目录冲突等
其次,attributeFormDefault
和elementFormDefault
不属于你的XML,而是属于你的XSD.
第三,正如 Martin Honnen 提到的,您的 XSD 缺少 Statistics
的元素声明。
第四,如果你真的不能改变XSD但又想使用它,你可以执行以下操作之一:
- 将它导入包装器 XSD 并声明一个
Statistics
元素,并使用 that XSD 来管理您的 XML. - 在你的XML中使用
xsi:type
。见如何限制值的 XML 元素在 XSD? 中使用 xsi:type
以下是如何在您的案例中使用 xsi:type
(未应用建议的命名空间修复):
<?xml version="1.0" encoding="UTF-8"?>
<Statistics xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/1999/xhtml try.xsd"
xmlns:tns="http://www.w3.org/1999/xhtml"
xsi:type="tns:Statistics">
<item>
<id>1</id>
<date>16.12.2015</date>
<name>test</name>
<email>test</email>
<Advertisers>
<item>
<id>2</id>
<ls_revenue_usd_equivalence>0</ls_revenue_usd_equivalence>
<revenue_eur>0</revenue_eur>
<revenue_usd>0</revenue_usd>
<revenue_rub>0</revenue_rub>
<ls_leads>0</ls_leads>
<revenue_usd_equivalence>0</revenue_usd_equivalence>
<leads>0</leads>
<payout_usd>0</payout_usd>
<payout_rub>0</payout_rub>
<payout_eur>0</payout_eur>
<payout_usd_equivalence>0</payout_usd_equivalence>
<profit>0</profit>
</item>
</Advertisers>
<total>
<leads>0</leads>
<payout_usd>0</payout_usd>
<payout_rub>0</payout_rub>
<payout_eur>0</payout_eur>
<payout_usd_equivalence>0</payout_usd_equivalence>
<profit>0</profit>
</total>
</item>
</Statistics>